package com.zengqingfa.examples.mybatisplus.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Description: String工具类
 */
public class StringUtils {
    /**
     * 删除对象中String类型的属性字段的头尾空白符
     *
     * @param object
     * @return
     */
    public static <T> T removeSpaces(T object) {
        Class<?> clazz = object.getClass();
        // 获取到所有的属性值
        Field[] fields = clazz.getDeclaredFields();
        Method setMethod;
        Method getMethod;

        for (Field field : fields) {
            // 判断属性是否为字符类型
            if ("class java.lang.String".equals(field.getGenericType().toString())) {
                try {
                    // 获取到当前字段名称，并首字母大写
                    String itemName = capitalizeFirstLetter(field.getName());
                    //根据属性名获取到方法名，再根据方法名获取到方法
                    getMethod = clazz.getMethod("get" + itemName);
                    setMethod = clazz.getMethod("set" + itemName, String.class);
                    // 执行获取到的方法，并传入参数，获取到当前字段对应的属性值
                    // 调用getter方法获取属性值
                    String val = (String) getMethod.invoke(object);
                    //执行set类型方法，为当前字段赋值为.trim()后的新值
                    setMethod.invoke(object, val.trim());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return object;
    }

    /**
     * 首字母大写
     *
     * @param s
     * @return
     */
    public static String capitalizeFirstLetter(String s) {
        char[] c = s.toCharArray();
        if ((c[0] >= 'a') && (c[0] <= 'z')) {
            c[0] -= 32;
        }
        return new String(c);
    }


    /**
     * 16进制直接转换成为字符串(无需Unicode解码)
     *
     * @param hexStr
     * @return
     */
    public static String hexStr2Str(String hexStr) {
        String str = "0123456789ABCDEF";
        // 注意此处，有的地方不使用空格分隔
        hexStr = hexStr.replace(" ", "");
        char[] hexs = hexStr.toCharArray();
        byte[] bytes = new byte[hexStr.length() / 2];
        int n;
        for (int i = 0; i < bytes.length; i++) {
            n = str.indexOf(hexs[2 * i]) * 16;
            n += str.indexOf(hexs[2 * i + 1]);
            bytes[i] = (byte) (n & 0xff);
        }
        return new String(bytes);
    }
}
